package com.hksj.cbm.service;

import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hksj.cbm.dto.DeviceCategoryDTO;
import com.hksj.cbm.entity.DeviceCategory;
import com.hksj.cbm.mapper.DeviceCategoryMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author zengke
 * @version 1.0
 * @see DeviceCategoryService
 * @since 2024/08/28 14:11
 */

@Service
public class DeviceCategoryService extends ServiceImpl<DeviceCategoryMapper, DeviceCategory> {

    /**
     * 新增设备分类
     * @param deviceCategoryDTO 设备分类对应的数据传输对象
     * @return 新增结果
     */
    @Transactional
    public String createDeviceCategory(DeviceCategoryDTO deviceCategoryDTO){

        //将数据传输对象转换为对应的对象实体类
        DeviceCategory deviceCategory = Convert.convert(DeviceCategory.class, deviceCategoryDTO);

        //调用新增的方法
        if (super.save(deviceCategory)){
            return "新增成功";
        }

        //否则新增失败
        return "新增失败";
    }

    /**
     * 更新设备分类
     * @param deviceCategoryDTO 设备分类对应的数据传输对象
     * @return 更新结果
     */
    @Transactional
    public String updateDeviceCategory(DeviceCategoryDTO deviceCategoryDTO){

        //将数据传输对象转换为对应的对象实体类
        DeviceCategory deviceCategory = Convert.convert(DeviceCategory.class, deviceCategoryDTO);

        //调用更新的方法
        if (super.updateById(deviceCategory)){
            return "更新成功";
        }

        //否则更新失败
        return "更新失败";
    }

    /**
     * 删除设备分类
     * @param code 设备
     * @return
     */
    @Transactional
    public String deleteDeviceCategory(String code){

        //根据code查询设备实体
        DeviceCategory deviceCategory = super.getById(code);

        //检查查询的设备实体是否为空
        if (ObjectUtils.isEmpty(deviceCategory)){
            throw new RuntimeException("请检查设备是否存在");
        }

        //调用删除的方法
        if (removeById(code)){
            return "删除成功";
        }

        //删除失败
        return "删除失败";
    }

    /**
     * 查询设备分类列表
     * @return 设备分类列表
     */
    public List<DeviceCategory> queryDeviceCategoryList(){
        return super.list();
    }

    /**
     * 查询设备分类树
     * @return 设备分类树
     */
    public List<DeviceCategory> queryDeviceCategoryTree(){

        //查询设备分类列表
        List<DeviceCategory> allDeviceCategoryList = super.list();

        //返回构建的树
        return getChildren("0",allDeviceCategoryList);
    }

    /**
     * 循环遍历获取设备分类树的子节点
     * @param parentCode 父节点的代码
     * @param allDeviceCategoryList 包含所有设备分类节点列表
     * @return 子节点树
     */
    private List<DeviceCategory> getChildren(String parentCode,List<DeviceCategory> allDeviceCategoryList){

        //获取parentCode为当前父节点code的那些节点
        List<DeviceCategory> children = allDeviceCategoryList.stream().filter(c -> Objects.equals(c.getParentCode(), parentCode)).collect(Collectors.toList());

        //若子节点为空则直接返回一个空的list集合
        if (ObjectUtils.isEmpty(children)){
            return new ArrayList<>();
        }

        //遍历子节点集合
        children.forEach(c -> {

            //获取该节点的code 为其子节点的parentCode
            String pCode = c.getCode();

            //递归获取该节点下的子节点
            List<DeviceCategory> cList = getChildren(pCode, allDeviceCategoryList);

            //将当前节点下所有子节点设置到当前节点中
            c.getChildren().addAll(cList);
        });

        //返回当前节点的子节点
        return children;
    }
}
